"""
预测 API 路由 - 独立的预测端点
"""
from fastapi import APIRouter, HTTPException
import logging

from app.models.video import PredictionRequest, PredictionResponse
from app.services.video_analysis import video_service

logger = logging.getLogger(__name__)

router = APIRouter(tags=["预测"])

@router.post("/predictions", response_model=PredictionResponse, summary="预测视频内容")
async def predict_video(request: PredictionRequest):
    """
    预测视频内容 - 支持URL和本地文件路径，使用场景检测提取关键帧，默认使用Ollama总结
    
    **输入参数:**
    - **video**: 视频URL或本地文件路径
    - **prompt**: 分析提示词（必填）
    - **scene_threshold**: 场景检测阈值（默认30.0，数值越小检测越敏感）
    - **max_new_tokens**: 最大生成token数（默认500）
    
    **支持的视频源:**
    - URL: `https://example.com/video.mp4`
    - 本地路径: `/path/to/video.mp4` 或 `D:\\videos\\sample.mp4`
    
    **场景检测说明:**
    - 使用PySceneDetect自动检测场景切换点
    - 只保留变化大的关键帧，避免冗余信息
    - 输入帧分辨率自动缩小到224x224
    - 超过30帧时自动分段处理
    
    **Ollama总结说明:**
    - 默认启用Ollama本地LLM总结功能
    - 视频分析完成后自动清理GPU内存
    - 使用mistral-nemo:12b模型生成中文总结
    - 提供原始分析和智能总结两种结果
    
    **场景阈值说明:**
    - `30.0` = 标准敏感度（推荐）
    - `20.0` = 较高敏感度（检测更多场景）
    - `50.0` = 较低敏感度（只检测明显场景变化）
    
    **示例请求:**
    ```json
    {
        "video": "https://www.shutterstock.com/shutterstock/videos/1104246027/preview/stock-footage-woman-friends-and-jumping-in-sea-holding-hands-for-fun-holiday-weekend-adventure-or-vacation-in.mp4",
        "prompt": "Describe this video and the people in it in detail",
        "scene_threshold": 30.0,
        "max_new_tokens": 500
    }
    ```
    
    **响应格式:**
    ```json
    {
        "output": "详细的视频分析结果...",
        "processing_time": 15.23,
        "frames_processed": 12,
        "batch_count": 1,
        "frame_extraction_method": "scene_detection",
        "ollama_summary": {
            "summary": "Ollama生成的中文智能总结...",
            "processing_time": 8.45,
            "model_used": "mistral-nemo:12b",
            "status": "success"
        },
        "ollama_enabled": true,
        "ollama_model": "mistral-nemo:12b"
    }
    ```
    """
    try:
        logger.info(f"收到预测请求")
        logger.info(f"Video: {request.video[:100]}...")
        logger.info(f"Prompt: {request.prompt}")
        logger.info(f"Scene threshold: {request.scene_threshold}")
        logger.info(f"Max tokens: {request.max_new_tokens}")
        
        # 调用预测服务
        result = await video_service.predict_video(
            video_path_or_url=request.video,
            prompt=request.prompt,
            scene_threshold=request.scene_threshold,
            max_tokens=request.max_new_tokens
        )
        
        logger.info(f"预测完成，处理时间: {result['processing_time']:.2f}s")
        
        return PredictionResponse(
            output=result["output"],
            processing_time=result["processing_time"],
            frames_processed=result["frames_processed"],
            batch_count=result.get("batch_count", 1),
            frame_extraction_method=result["frame_extraction_method"],
            ollama_summary=result.get("ollama_summary"),
            ollama_enabled=result.get("ollama_enabled", True),
            ollama_model=result.get("ollama_model")
        )
        
    except Exception as e:
        error_msg = str(e)
        logger.error(f"视频预测失败: {error_msg}")
        
        # 根据错误类型返回不同的HTTP状态码
        if "下载" in error_msg or "URL" in error_msg:
            raise HTTPException(status_code=400, detail=f"视频下载失败: {error_msg}")
        elif "文件不存在" in error_msg:
            raise HTTPException(status_code=404, detail=f"视频文件未找到: {error_msg}")
        elif "模型" in error_msg:
            raise HTTPException(status_code=503, detail=f"模型服务不可用: {error_msg}")
        else:
            raise HTTPException(status_code=500, detail=f"视频预测失败: {error_msg}")